#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "dialog.h"
#include "ppyldialog.h"
#include <vector>
#include <QMediaPlayer>
#include <QMenu>
#include <QMenuBar>
#include <QStatusBar>

using std::vector ;
using std::pair ;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

    void paintEvent(QPaintEvent *p) ;       // 画图函数

private:
    int status = 0 ;        // 表示当前选中的骨牌，编号从 0 开始，初始设为 -1
    int tot = 0 ;           // 表示当前有几个格子被覆盖了，如果tot == 64， 说明所有的格子都被铺满了
    int n = 0 ;         // 表示棋盘的大小
    bool w[10][10] ;         // 存棋盘，表示第 （i , j） 个格子是否被覆盖
    bool enable = true ;        // 判断最后一张骨牌是否是不可覆盖的
    bool chessboard=false;      //判断是否铺设棋盘
    int size = 60 ;         // 每个格子的宽度
    int startx = 60 , starty = 40 ;     // 棋盘离窗口左上角的横纵距离
    int color[20][3] = {        // 存 17 种颜色的rgb值，用作设置画笔的颜色
        {150, 205, 205} ,
        {255, 228, 225} ,
        {112, 128, 144} ,
        {84, 255, 159} ,
        {230, 230, 250} ,
        {65,105,225} ,
        {176,196,222} ,
        {180, 82, 205} ,
        {99, 184, 255} ,
        {96, 123, 139} ,
        {139, 0, 139} ,
        {30, 144, 255} ,
        {54, 100, 139} ,
        {205, 0, 205} ,
        {255, 20, 147} ,
        {139, 10, 80} ,
        {255, 0, 0}
    } ;
    int card[4][4][4][2] = {        // 存下四种骨牌四种方向的相对坐标
        { {{0 , 0} , {0 , 1} , {0 , 2} , {0 , 3}} ,         // 最左侧点     横着
          {{0 , 0} , {1 , 0} , {2 , 0} , {3 , 0}} ,         // 最上侧点     竖着
          {{0 , 0} , {0 , -1} , {0 , -2} , {0 , -3}} ,      // 最右侧点     横着
          {{0 , 0} , {-1 , 0} , {-2 , 0} , {-3 , 0}}        // 最下侧点     竖着
        },       // 直行
        { {{0 , 0} , {0 , 1} , {1 , 0} , {1 , 1}} ,     // 左上角点
          {{0 , 0} , {0 , -1} , {1 , 0} , {1 , -1}} ,       // 右上角点
          {{0 , 0} , {0 , 1} , {-1 , 0} , {-1 , 1}} ,       // 左下角点
          {{0 , 0} , {0 , -1} , {-1 , 0} , {-1 , -1}}       // 右下角点
        },       // 方形，总共只有一种状态
        { {{0 , 0} , {1 , 0} , {0 , 1} , {0 , 2}} ,       //    左上角点        横着
          {{0 , 0} , {0 , 1} , {1 , 1} , {2 , 1}} ,       //    左上角点        竖着
          {{0 , 0} , {0 , 1} , {0 , 2} , {-1 , 2}} ,      //    左下角点        横着（反着横着）
          {{0 , 0} , {0 , 1} , {-1 , 1} , {-2 , 1}} ,     //    左下角点        竖着（反着竖着）
        },      // L 型
        { {{0 , 0} , {0 , 1} , {-1 , 1} , {0 , 2}} ,        // 最左侧点         横着
          {{0 , 0} , {1 , 0} , {1 , 1} , {2 , 0}} ,         // 最上侧点         竖着
          {{0 , 0} , {0 , 1} , {1 , 1} , {0 , 2}} ,         // 最左侧点         倒着横着
          {{0 , 0} , {1 , 0} , {1 , -1} , {2 , 0}}          // 最上侧点         反着竖着
        }      // T 型
    } ;       // 存四种牌的不同状态的情况
    bool dfs(int x , int y) ;       // dfs 函数，用来深搜查找符合条件的铺牌方案
    pair<int , int> find_next(int x , int y) ;      // 找到下一个深搜的点
    vector<vector<pair<int , int>>> cards ;         // 存储所有铺设了的骨牌的每个点的坐标

private slots:
    void on_comboBox_activated(int index);      // 多选框
    void on_start_clicked();        // 开始按钮点击后开始执行

    void on_exitBtn_clicked();

    void on_yzylBtn_clicked();

    void on_psBtn_clicked();

    void on_ppylBtn_clicked();
   //void on_continueBtn_clicked();

    void on_pauseBtn_clicked();

private:
    Ui::Widget *ui;
    Dialog *dialog;
    ppylDialog *pplydialog;
    QMediaPlayer *music = new QMediaPlayer();
    bool isPause=false;
    int count=0;
};

#endif // WIDGET_H
